//created by kael 2025.07.21
//modified by kael 2025.07.21

//Write logs to the specified file (header)

#ifndef LOGTOFILE_H_
#define LOGTOFILE_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stdarg.h>
#include <pthread.h>


// 日志文件名称
#ifndef LOGTOFILE_LOG_PATH
#define LOGTOFILE_LOG_PATH "./server_log"
#endif

// 默认日志级别（如果未定义）
#ifndef LOGTOFILE_MIN_LEVEL
#define LOGTOFILE_MIN_LEVEL LOGTOFILE_DEBUG  // 默认输出所有级别
#endif

// 日志级别
typedef enum {
    LOGTOFILE_DEBUG,
    LOGTOFILE_INFO,
    LOGTOFILE_WARNING,
    LOGTOFILE_ERROR
} LogToFile_Level;


// 日志函数 入参：1指定的写入的文件 2等级 3格式化输出 4格式化输出参数
// 使用示例 
// logToFile("app.log", LOG_INFO, "Thread %ld: Count %d", arg, i);
void logToFile(const char* filename, LogToFile_Level level, const char* format, ...);

// 简化宏 编译时可控制输出等级
#define LOG_DEBUG(format, ...)   \
    do { if (LOGTOFILE_MIN_LEVEL <= LOGTOFILE_DEBUG)   \
        logToFile(LOGTOFILE_LOG_PATH, LOGTOFILE_DEBUG, format, ##__VA_ARGS__); } while (0)

#define LOG_INFO(format, ...)   \
    do { if (LOGTOFILE_MIN_LEVEL <= LOGTOFILE_INFO)   \
        logToFile(LOGTOFILE_LOG_PATH, LOGTOFILE_INFO, format, ##__VA_ARGS__); } while (0)

#define LOG_WARNING(format, ...)   \
    do { if (LOGTOFILE_MIN_LEVEL <= LOGTOFILE_WARNING)   \
        logToFile(LOGTOFILE_LOG_PATH, LOGTOFILE_WARNING, format, ##__VA_ARGS__); } while (0)

#define LOG_ERROR(format, ...)   \
    do { if (LOGTOFILE_MIN_LEVEL <= LOGTOFILE_ERROR)   \
        logToFile(LOGTOFILE_LOG_PATH, LOGTOFILE_ERROR, format, ##__VA_ARGS__); } while (0)
#endif